﻿namespace EasyWeb.Test
{
    using System;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using EasyWeb.Validation;

    [TestClass]
    public class EWCompareValidationAttribute_Test
    {
        [TestMethod]
        public void NonNullable_Test()
        {
            var actual = default(bool);

            actual = EWCompareValidationAttribute.CompareEquals(10, 10);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareEquals(20, 10);
            Assert.AreEqual(false, actual);

            actual = EWCompareValidationAttribute.CompareNotEquals(10, 10);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareNotEquals(10, 20);
            Assert.AreEqual(true, actual);

            actual = EWCompareValidationAttribute.CompareGreaterThan(20, 10);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThan(10, 10);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThan(10, 20);
            Assert.AreEqual(false, actual);

            actual = EWCompareValidationAttribute.CompareGreaterThanOrEquals(20, 10);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThanOrEquals(10, 10);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThanOrEquals(10, 20);
            Assert.AreEqual(false, actual);

            actual = EWCompareValidationAttribute.CompareLessThan(20, 10);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareLessThan(10, 10);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareLessThan(10, 20);
            Assert.AreEqual(true, actual);

            actual = EWCompareValidationAttribute.CompareLessThanOrEquals(20, 10);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareLessThanOrEquals(10, 10);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareLessThanOrEquals(10, 20);
            Assert.AreEqual(true, actual);
        }

        [TestMethod]
        public void Nullable_Test()
        {
            var actual = default(bool);

            actual = EWCompareValidationAttribute.CompareEquals((int?)10, (int?)10);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareEquals((int?)20, (int?)10);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareEquals(new int?(), new int?());
            Assert.AreEqual(true, actual);

            actual = EWCompareValidationAttribute.CompareNotEquals((int?)10, (int?)10);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareNotEquals((int?)10, (int?)20);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareNotEquals((int?)10, new int?());
            Assert.AreEqual(true, actual);

            actual = EWCompareValidationAttribute.CompareGreaterThan((int?)20, (int?)10);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThan((int?)10, (int?)10);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThan((int?)10, (int?)20);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThan((int?)10, new int?());
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThan(new int?(), (int?)20);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThan(new int?(), new int?());
            Assert.AreEqual(false, actual);

            actual = EWCompareValidationAttribute.CompareGreaterThanOrEquals((int?)20, (int?)10);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThanOrEquals((int?)10, (int?)10);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThanOrEquals((int?)10, (int?)20);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThanOrEquals((int?)10, new int?());
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThanOrEquals(new int?(), (int?)20);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareGreaterThanOrEquals(new int?(), new int?());
            Assert.AreEqual(true, actual);

            actual = EWCompareValidationAttribute.CompareLessThan((int?)20, (int?)10);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareLessThan((int?)10, (int?)10);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareLessThan((int?)10, (int?)20);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareLessThan((int?)10, new int?());
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareLessThan(new int?(), (int?)20);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareLessThan(new int?(), new int?());
            Assert.AreEqual(false, actual);

            actual = EWCompareValidationAttribute.CompareLessThanOrEquals((int?)20, (int?)10);
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareLessThanOrEquals((int?)10, (int?)10);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareLessThanOrEquals((int?)10, (int?)20);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareLessThanOrEquals((int?)10, new int?());
            Assert.AreEqual(false, actual);
            actual = EWCompareValidationAttribute.CompareLessThanOrEquals(new int?(), (int?)20);
            Assert.AreEqual(true, actual);
            actual = EWCompareValidationAttribute.CompareLessThanOrEquals(new int?(), new int?());
            Assert.AreEqual(true, actual);
        }

        [TestMethod]
        [ExpectedException(typeof(InvalidOperationException))]
        public void Comparable_Invalid_Test()
        {
            EWCompareValidationAttribute.GetComparableInterface(new object());
        }

        [TestMethod]
        [ExpectedException(typeof(InvalidOperationException))]
        public void Comparable_Null_Test()
        {
            EWCompareValidationAttribute.GetComparableInterface(null);
        }
    }
}
